package models

import (
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_"github.com/go-sql-driver/mysql"
	"fmt"
)

var (
	//数据库连接配置
	mysqlUser = beego.AppConfig.String("mysqlUser")
	mysqlPass = beego.AppConfig.String("mysqlPass")
	mysqlUrl = beego.AppConfig.String("mysqlUrl")
	mysqlDB = beego.AppConfig.String("mysqlDB")

	//数据库表
	Module = new(AdminModule)
	Role = new(AdminRole)
	Rolemodule = new(AdminRolemodule)
	Systemconfig = new(AdminSystemconfig)
	User = new(AdminUser)
	UserRole = new(AdminUserRole)
	//AU = new(AUser)
	//CO = new(TCount)

	//Ormer对象
	o orm.Ormer
)


//数据库连接
//注册数据库
//ORM 创建
func RegisterDB()  {
	//注册数据库
	orm.RegisterDriver("mysql",orm.DRMySQL)
	//models := []interface {}{Module,Role,Rolemodule,Systemconfig,User,UserRole}
	//注册模块
	orm.RegisterModel(Module,Rolemodule,Systemconfig,User,UserRole)
	//数据库连接
	dblink := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s", mysqlUser, mysqlPass, mysqlUrl, mysqlDB, "utf8")
	// 参数4(可选)  设置最大空闲连接
	// 参数5(可选)  设置最大数据库连接 (go >= 1.2)
	maxIdle := 30
	maxConn := 30
	//创建连接
	if err := orm.RegisterDataBase("default", "mysql", dblink, maxIdle, maxConn); err != nil {
		panic(err)
	}
	o = orm.NewOrm()
}

//从单表中根据条件获取数据列表
//@param            table           需要查询的表
//@param            p               页码
//@param            listRows        每页显示记录数
//@param            condition       查询条件
//@param            orderBy         排序
//@return           params          数据列表
//@return           rows            返回的记录数
//@return           err             错误
func GetList(table string, p, listRows int, condition *orm.Condition, orderBy ...string) (params []orm.Params, rows int64, err error) {
	rows, err = o.QueryTable(table).SetCond(condition).Limit(listRows).Offset((p - 1) * listRows).OrderBy(orderBy...).Values(&params)
	return params, rows, err
}

//根据指定的表和id条件更新表字段，不支持批量更新
//@param            table                   需要更新的表
//@param            data                    需要更新的字段
//@param            filter                  过滤条件，如"Id__in"
//@param            filterValue             过滤条件的值
//@return           affected                影响的记录数
//@return           err                     错误
func UpdateByField(table string, data map[string]interface{}, filter string, filterValue ...interface{}) (affected int64, err error) {
	return o.QueryTable(table).Filter(filter, filterValue...).Update(data)
}


//对单表记录进行统计查询
//@param            table           需要查询或者统计的表
//@param            cond            查询条件
//@return           cnt             统计的记录数
func Count(table string, cond *orm.Condition) (cnt int64) {
	cnt, _ = o.QueryTable(table).SetCond(cond).Count()
	return
}


//根据条件查询总条数和数
//@param			table			查询表
//@param 			pageNo			页码
//@param			pageSize		每页显示记录数
//@param			condition		条件
//@param            orderBy         排序
func GetPageList(table string,pageNo, pageSize int,condition *orm.Condition,orderBy ...string) (params []orm.Params, count, rows int64, err error) {
	count,err = o.QueryTable(table).SetCond(condition).Count()
	if err != nil {
		return
	}
	if count > 0 {
		rows,err = o.QueryTable(table).SetCond(condition).Limit(pageSize).Offset((pageNo -1) * pageSize).OrderBy(orderBy ...).Values(&params)
	}
	return
}